package cn.com.wangluotongxin.database.mysql;

import cn.com.wangluotongxin.common.exceptions.BadResponseException;
import cn.com.wangluotongxin.database.mysql.utils.*;
import cn.com.wangluotongxin.database.properties.SourceDatabaseProperties;
import cn.com.wangluotongxin.mysql.DatabaseConnection;
import cn.com.wangluotongxin.mysql.pojo.DatabaseVo;
import cn.com.wangluotongxin.mysql.pojo.TableColumnsVo;
import cn.com.wangluotongxin.mysql.pojo.TableIndexVo;
import cn.com.wangluotongxin.mysql.pojo.TableVo;
import cn.com.wangluotongxin.mysql.service.SqlConnection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class LoadMysqlDatabaseInfoService {

    @Autowired
    private SourceDatabaseProperties dataSourceProperties;

    public void load() {
        // 创建数据库链接(初始数据库)
        SqlConnection connection = DatabaseConnection.create(true, false)
                .setProperty(dataSourceProperties.getUrl(), dataSourceProperties.getUsername(), dataSourceProperties.getPassword())
        .connection();
        // 缓存链接
        SourceMysqlConnectionUtil.setConnection(connection);

        // 加载数据库信息
        this.loadDatabase();

        // 加载数据库表信息
        this.loadTables();

        // 加载数据库表列的信息
        this.loadTableColumns();

        // 加载表的索引
        this.loadTableIndexes();
    }

    public void loadDatabase() {
        SqlConnection sqlConnection = SourceMysqlConnectionUtil.getConnection();
        if (sqlConnection == null) {
            throw new BadResponseException("sql connection is null");
        }
        DatabaseVo databaseVo = sqlConnection.getDatabase();
        SourceMySqlDatabaseUtil.setDatabase(databaseVo);
    }

    public void loadTables() {
        SqlConnection sqlConnection = SourceMysqlConnectionUtil.getConnection();
        if (sqlConnection == null) {
            throw new BadResponseException("sql connection is null");
        }
        List<TableVo> tableVos = sqlConnection.getTables();
        for(TableVo tableVo : tableVos){
            List<TableColumnsVo> tableColumnsVos = sqlConnection.getColumns(tableVo.getTableName());
            tableVo.setTableColumnsVos(tableColumnsVos);
        }
        SourceMySqlTablesUtil.setTableVos(tableVos);
    }

    public void loadTableColumns() {
        SqlConnection sqlConnection = SourceMysqlConnectionUtil.getConnection();
        if (sqlConnection == null) {
            throw new BadResponseException("sql connection is null");
        }

        List<TableVo> tableVos = SourceMySqlTablesUtil.getTableVos();
        for(TableVo tableVo : tableVos) {
            List<TableColumnsVo> columns = sqlConnection.getColumns(tableVo.getTableName());
            SourceMySqlTableColumnsUtil.set(tableVo.getTableName(), columns);
        }
    }

    private void loadTableIndexes() {
        SqlConnection sqlConnection = SourceMysqlConnectionUtil.getConnection();
        if (sqlConnection == null) {
            throw new BadResponseException("sql connection is null");
        }
        List<TableVo> tableVos = SourceMySqlTablesUtil.getTableVos();
        for(TableVo tableVo : tableVos) {
            List<TableIndexVo> indexVos = sqlConnection.getIndex(tableVo.getTableName());
            SourceMySqlTableIndexesUtil.set(tableVo.getTableName(), indexVos);
        }
    }
}
